package com.platform.common.result;

import com.platform.common.enums.HttpStatus;
import lombok.Getter;
import lombok.ToString;

import java.io.Serializable;

/**
 * @description 反馈结果类
 * @author hbc
 **/

@Getter
@ToString
public class ResponseResult<T> implements Serializable {
	private static final long serialVersionUID = 1L;

	private int code;
	private String message;
	private Boolean success;
	private long timestamp;
	private Object data;

	private ResponseResult() {
		this.timestamp = System.currentTimeMillis();
	}

	/**
	 * 成功响应，但无响应数据。
	 */
	public static ResponseResult ok() {
		return ok(null);
	}

	/**
	 * 错误响应，需要客户端处理的
	 */
	public static ResponseResult fail() {
		return new ResponseResult()
				.code(ApiExceptionEnum.PARAM_NOT_VALID.code)
				.success(false)
				.message(ApiExceptionEnum.PARAM_NOT_VALID.message);
	}

	/**
	 * 错误响应，需要客户端处理的
	 */
	public static ResponseResult fail(ApiExceptionEnum em) {
		return new ResponseResult()
				.code(em.code)
				.success(false)
				.message(em.message);
	}

	/**
	 * 错误响应，需要客户端处理的
	 */
	public static ResponseResult fail(int code, String message) {
		return new ResponseResult()
				.code(code)
				.success(false)
				.message(message);
	}

	/**
	 * 错误响应，存在响应数据。
	 */
	public static <T> ResponseResult<T> fail(HttpStatus status) {
		return new ResponseResult()
				.code(status.value())
				.success(false)
				.message(status.getReasonPhrase())
				.data(null);
	}

	/**
	 * 错误响应，存在响应数据。
	 */
	public static <T> ResponseResult<T> fail(T data) {
		return new ResponseResult()
				.code(ApiExceptionEnum.COMMON_FAIL.code)
				.success(false)
				.message(ApiExceptionEnum.COMMON_FAIL.message)
				.data(data);
	}


	/**
	 * 异常反馈，需要服务端处理的
	 */
	public static ResponseResult error(ApiExceptionEnum em) {
		return fail(em);
	}

	/**
	 * 异常反馈，需要服务端处理的
	 */
	public static ResponseResult error() {
		return new ResponseResult()
				.code(ApiExceptionEnum.COMMON_FAIL.code)
				.success(false)
				.message(ApiExceptionEnum.COMMON_FAIL.message);
	}


	/**
	 * 成功响应，存在响应数据。
	 */
	public static <T> ResponseResult<T> ok(T data) {
		return new ResponseResult()
				.code(ApiExceptionEnum.SUCCESS.code)
				.success(true)
				.message(ApiExceptionEnum.SUCCESS.message)
				.data(data);
	}




	public ResponseResult data(T data) {
		this.data = data;
		return this;
	}

	public ResponseResult message(String message) {
		this.message = message;
		return this;
	}

	public ResponseResult code(int code) {
		this.code = code;
		return this;
	}

	public ResponseResult success(Boolean success) {
		this.success = success;
		return this;
	}
}
